import requests
import json

# Ollama API 地址
OLLAMA_API_URL = "http://localhost:11434"
# MODEL_NAME = "deepseek-r1:1.5b"
MODEL_NAME = "deepseek-r1-lvkong-v3"

# SerpAPI 密钥
SERPAPI_KEY = "your_serpapi_key_here"  # 替换为你的 SerpAPI 密钥

# 系统提示
SYSTEM = """
你是一个严谨的AI助手，必须用中文回答问题。
你的回答必须详细，准确，并且遵循以下格式：
User: [用户输入]
Assistant: [你的回答]
如果用户的问题不明确，请要求用户提供更多信息。
如果问题需要实时信息，请使用联网搜索功能获取最新数据。
"""

# 模板
def build_prompt(system_prompt, user_input, search_results=None):
    prompt = f"""<|system|>
{system_prompt}<|end|>
<|user|>
User: {user_input}<|end|>
<|assistant|>
Assistant:"""
    if search_results:
        prompt += f"\n以下是根据你的问题搜索到的实时信息：\n{search_results}\n"
    return prompt

# 联网搜索函数
def search_web(query, api_key):
    """
    调用 SerpAPI 进行联网搜索
    """
    url = "https://serpapi.com/search"
    params = {
        "q": query,  # 搜索关键词
        "api_key": api_key  # SerpAPI 密钥
    }
    try:
        response = requests.get(url, params=params, timeout=10)
        if response.status_code == 200:
            return response.json()  # 返回搜索结果
        else:
            print(f"搜索失败，状态码：{response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"搜索请求发生错误：{e}")
        return None

# 主函数
def get_deepseek_response(user_input):

    if user_input == "退出" or user_input == "结束":
        continue_flag = False  # 退出循环
        print("感谢使用！")
        return

    # 判断是否需要联网搜索
    need_search = "最新" in user_input or "实时" in user_input or "今天" in user_input  # 根据关键词判断
    search_results = None
    if need_search:
        print("正在联网搜索...")
        search_data = search_web(user_input, SERPAPI_KEY)
        if search_data:
            search_results = search_data.get("organic_results", [])  # 提取搜索结果
            search_results = "\n".join([f"{result['title']}: {result['link']}" for result in search_results[:3]])  # 取前 3 条结果

    # 组织请求数据
    data = {
        "model": MODEL_NAME,
        "prompt": build_prompt(SYSTEM, user_input, search_results),  # 使用模板构建完整的提示
        "stream": True  # 启用流式输出
    }

    try:
        # 发送 POST 请求
        # print("DeepSeek回复：", end="", flush=True)
        response = requests.post(f"{OLLAMA_API_URL}/api/generate", json=data, timeout=30, stream=True)

        # 处理流式响应
        if response.status_code == 200:
            full_response = ""
            skip_flag = False  # 跳过 <think> 标签
            for line in response.iter_lines():
                if line:
                    # 解析 JSON
                    chunk = line.decode("utf-8")  # 将字节流转换为字符串
                    json_data = json.loads(chunk)  # 将字符串转换为字典
                    # print(json_data)


                    if "response" in json_data:
                        full_response += json_data["response"]  # 追加响应

                    if json_data.get("done", False):
                        break  # 如果 done 为 True，结束循环

            return full_response

        else:
            print(f"请求失败，状态码：{response.status_code}")
            print("API 返回：", response.text)
    except requests.exceptions.Timeout:
        print("请求超时，请检查网络或 API 服务是否正常。")
    except requests.exceptions.RequestException as e:
        print(f"请求发生错误：{e}")
        
import pyttsx3
def talkContent(content):
    """使用系统文字转语音朗读内容，提高运行效率"""
    # 初始化引擎一次，后续复用
    engine = pyttsx3.init()
    # 设置朗读速度
    engine.setProperty('rate', 160)

    # 朗读内容
    engine.say(content)
    
    # 只调用一次 runAndWait() 处理完所有加入队列的内容
    engine.runAndWait()

# if __name__ == '__main__':
#     while True:
#         input_text = input("请输入问题：")
#         if input_text=="":
#             # print("deepseek回复：拜拜了您嘞！")
#             # talkContent("拜拜了您嘞！")
#             break
#         text = get_deepseek_response(input_text)
#         print("deepseek回复：", text)
#         # talkContent(text)
#         print("\n")